package Controlador;


import java.util.Iterator;
import java.util.Timer;
import java.util.TimerTask;

import Modelo.*;
import Vista.PantallaJuego;

public class Controlador {
	
	private Habilidad habilidadSeleccionada;
	private Juego juego;	
	private PantallaJuego vista;
	private static final long tiempoEspera = 1000;  // control cada 750 m segundos
	private Timer t;
	
	
	
	public Controlador(Juego unJuego, PantallaJuego unaVista ){
		juego=unJuego;
		vista = unaVista; 
		t = new Timer();
        t.schedule(new Temporizador(), tiempoEspera, tiempoEspera);
	}
	
	public boolean asignarHabilidadA(int x, int y){
		
		if(habilidadSeleccionada==null)
			return false;
		
		// con lo que hizo nestor, recibo las coordenadas del bloque
		int fila= x;
		int columna= y;
		
		Mapa mapa= juego.getMapa();
		if (mapa == null) System.out.println("El mapa es nulo");
		
		System.out.println(fila + "  " + columna);
		
		if (mapa.getBloque(fila, columna).getAlojados()== null ){
			System.out.println("los alojados son nulos");
			return false;
		}
		
		if(mapa.getBloque(fila, columna).getAlojados().size()==0)
			return false; // no hay alojados
		
		// si hay uno o mas, intento asignar. Se le asigna al primero asignable
		Iterator<Personaje> it= mapa.getBloque(fila, columna).getAlojados().iterator();
		while(it.hasNext()){
			PoseedorDeHabilidad receptor= (PoseedorDeHabilidad) it.next();
			if( juego.asignarHabilidadA(receptor,habilidadSeleccionada)){
				//Tambien tengo q restar la cantidad de habilidades 
				//disponibles en el panel de habilidades, despues d asignar
				System.out.println("("+ juego.tiempoFaltante() +") Fue asignada " + habilidadSeleccionada.getClass().getName());
				habilidadSeleccionada=null;
				return true;
			}
		}
		System.out.println("La habilidad NO fue asignada");
		return false;
	}
	
	public void tomarHabilidad(Habilidad unaHabilidadSeleccionada){
		habilidadSeleccionada = unaHabilidadSeleccionada;
		System.out.println("Seleccionaste " + habilidadSeleccionada.getClass().getName());
	}
	
	public void correrCiclo(){
		
		correrUnTurno();
		vista.update();
		
		if (juego.finNivel()){
			this.terminarJuego();
			System.out.println(juego.resultado());
			System.out.println(juego.getPuntaje());
			vista.resultado(juego.ganado());
		}
	}
	private void correrUnTurno() {
	
		juego.ciclo();
		
	}
	
	public void terminarJuego(){
		if (juego != null){
			t.cancel();
		}
	}
	
	public void reiniciar(){
		t = new Timer();
        t.schedule(new Temporizador(), tiempoEspera, tiempoEspera);
	}
	
	private class Temporizador extends TimerTask {

		public void run() {
			correrCiclo();
        }  
	}
}
